x86: Enable THERM_CONTROL_MSR write for dom0 even when cpufreq=xen
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 5 Mar 2009 15:02:02 +0000 (15:02 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 5 Mar 2009 15:02:02 +0000 (15:02 +0000)
Signed-off-by: Wei Gang <gang.wei@intel.com>
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/arch/x86/traps.c

index 59da03404250ec73ada8b01b6c5e351cf5eeaf4e..84f09c6c76525d9006fa26de02c9c2b983a452d4 100644 (file)
@@ -2187,7 +2187,6 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
         case MSR_IA32_MPERF:
         case MSR_IA32_APERF:
         case MSR_IA32_PERF_CTL:
-        case MSR_IA32_THERM_CONTROL:
             if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL )
                 goto fail;
             if ( !is_cpufreq_controller(v->domain) )
@@ -2195,6 +2194,14 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
             if ( wrmsr_safe(regs->ecx, eax, edx) != 0 )
                 goto fail;
             break;
+        case MSR_IA32_THERM_CONTROL:
+            if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL )
+                goto fail;
+            if ( (v->domain->domain_id != 0) || !v->domain->is_pinned )
+                break;
+            if ( wrmsr_safe(regs->ecx, eax, edx) != 0 )
+                goto fail;
+            break;
         default:
             if ( wrmsr_hypervisor_regs(regs->ecx, eax, edx) )
                 break;